//路由鉴权文件，校验是否登录，路由是否有权限访问等
import router from "@/router";
import { GET_TOKEN } from "@/utils/token";
import { ElMessage } from "element-plus";
//引入项目配置，实现修改页面标题
import setting from "./setting";
//引入进度条,进度条样式在nodemodules中调整
//@ts-ignore
import nprogress from "nprogress";
import "nprogress/nprogress.css";
//引入用户仓库，这里要注意，组件外使用仓库必须先引入大仓库
import useUserStore from "./store/modules/user";
import pinia from "./store";
let userStore = useUserStore(pinia);

//取消进度条的右侧加载圆球
nprogress.configure({ showSpinner: false });

//全局前置守卫
//@ts-ignore
router.beforeEach((to: any, from: any, next: any) => {
  //控制页面标题
  document.title = `${setting.title}-${to.meta.title}`;

  //校验用户是否已经登录（存入Token），是则直接进入主页，如果存在来访页，则进入来访页
  let token = GET_TOKEN();
  switch (to.path) {
    //用户访问登录页
    case "/login":
      if (token && userStore.token) {
        //用户已登录
        next({ path: to.query.redirectUrl || "/", redirect: true });
      } else {
        //用户未登录
        next();
      }
      break;
    //用户访问不存在的页面
    case "/404":
      next();
      break;
    //用户访问其他页面
    default:
      if (token && userStore.token) {
        //用户已登录，判断是否有用户信息
        //进度条开始
        nprogress.start();
        let userDetail = userStore.userDetail;
        if (userDetail) {
          //有信息，直接放行
          next();
        } else {
          //无信息，先获取信息
          userStore
            .userInfo()
            .then(() => {
              //获取成功，放行
              next();
            })
            .catch((err) => {
              //token过期/token被篡改/获取信息失败 触发
              userStore
                .logOut()
                .then(() => {
                  //成功退出登录
                  ElMessage({
                    type: "error",
                    message: err,
                  });
                  next({
                    path: "/login",
                    query: {
                      redirectUrl: to.fullPath,
                    },
                  });
                })
                .catch((err) => {
                  //退出失败
                  ElMessage({
                    type: "error",
                    message: err,
                  });
                  next();
                });
            });
        }
      } else {
        //用户未登录
        ElMessage({
          type: "error",
          message: "未获取到用户信息,请先登录",
        });
        next({
          path: "/login",
          query: {
            redirectUrl: to.fullPath,
          },
        });
      }
      break;
  }
});

//全局后置守卫
//@ts-ignore
router.afterEach((to: any, from: any) => {
  //进度条结束
  nprogress.done();
});
